package com.corechina.apex_osswords.common;

import com.corechina.apex_osswords.domain.entity.SysLogs;
import com.corechina.apex_osswords.service.ISysLogsService;
import com.google.gson.Gson;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Date;

/**
 * @program: apex_osswords
 * @description: 日志切面处理业务类
 * @author: cc
 * @create: 2020-03-18 09:58
 **/

@Aspect
@Component
public class SysLogAspect {
    @Autowired
    private ISysLogsService iSysLogs;

    @Pointcut("@annotation(com.corechina.apex_osswords.common.SysLog)")
    public void logPointCut() {

    }

    @Around("logPointCut()")
    public Object around(ProceedingJoinPoint point) throws Throwable {
        long beginTime = System.currentTimeMillis();
        //执行方法
        Object result = point.proceed();
        //执行时长(毫秒)
        long time = System.currentTimeMillis() - beginTime;
        //保存日志
        saveSysLog(point, time);
        return result;
    }

    private void saveSysLog(ProceedingJoinPoint joinPoint, long time) {
        Signature sig = joinPoint.getSignature();
        MethodSignature signature;
        if (!(sig instanceof MethodSignature)) {
            throw new IllegalArgumentException("该注解只能用于方法");
        }
        signature = (MethodSignature) sig;
        Method method = signature.getMethod();

        SysLogs sysLog = new SysLogs();
        SysLog syslog = method.getAnnotation(SysLog.class);
        sysLog.setCreateTime(new Date());
        if(syslog != null){
            //注解上的描述
            sysLog.setOperation(syslog.value());
        }

        //请求的方法名
        String className = joinPoint.getTarget().getClass().getName();
        String methodName = signature.getName();
        sysLog.setMethod(className + "." + methodName + "()");


        //请求的参数
        Object[] args = joinPoint.getArgs();
        try{
            String params = new Gson().toJson(args[0]);
            sysLog.setAfterData(params);
        }catch (Exception e){

        }

        //获取request
        HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
        //设置IP地址
        sysLog.setIp(IPUtils.getIpAddr(request));

        Integer userId = null;
        if(ShiroUtils.getUserEntity() != null){
            if(ShiroUtils.getUserId() != null){
                userId = ShiroUtils.getUserId();
            }
        }

        sysLog.setOperator(userId);

        sysLog.setOperationTime(String.valueOf(time));
        //保存系统日志
        iSysLogs.add(sysLog);
    }
}
